package com.h5.test;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.text.MessageFormat;
import java.util.Enumeration;
import java.util.Properties;

public class H5show extends javax.servlet.http.HttpServlet {

    @Override
    protected void doPut(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //重定向 方式1
        //使用response设置302状态码和设置location响应头实现重定向实现请求重定向
        //response.setHeader("Location", "/JavaWeb_HttpServletResponse_Study_20140615/index.jsp");
        //response.setStatus(HttpServletResponse.SC_FOUND);//设置302状态码，等同于response.setStatus(302);

        //重定向 方式2 到本项目下的index.jsp
        response.sendRedirect(request.getContextPath()+"/index.jsp");

    }

    protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
        //跳转到Get方法中
        this.doGet(request, response);
    }

    protected void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
        response.setContentType("text/html");
        response.setContentType("text/html;charset=UTF-8");


        //全站 初始化参数
        ServletContext context = this.getServletContext();
        String contextInitParam = context.getInitParameter("mysqlConnect");
        response.getWriter().write(contextInitParam);


        response.getWriter().write("<hr>");

        // 本类 系统参数
        String systemConfig = getInitParameter("myParam");
        response.getWriter().write(systemConfig);


        response.getWriter().write("<hr>");


        // 本类 调用全部系统参数
        Enumeration<String> allSystemConfig = getInitParameterNames();
        while (allSystemConfig.hasMoreElements()) {
            String name = allSystemConfig.nextElement();
            String value = getInitParameter(name);
            response.getWriter().print(name + "=" + value + "<br/>");
        }


        // 请求转发到 Default模块
        // ServletContext contextRequest = this.getServletContext();//获取ServletContext对象
        // RequestDispatcher rd = contextRequest.getRequestDispatcher("/servlet/Default");//获取请求转发对象(RequestDispatcher)
        // rd.forward(request, response);//调用forward方法实现请求转发


        //使用servletContext读取资源文件
        response.getWriter().println("<hr/>");
        //读取WebRoot目录下的properties配置文件
        readWebRootDirPropCfgFile(response);

        response.getWriter().println("<hr/>");

        //读取src目录下的gacl.servlet.study包中的db4.properties配置文件
        readPropCfgFile2(response);

        response.getWriter().println("<hr/>");

        // 使用OutputStream流 方式输出中文
        // 所以使用PrintWriter流处理字节数据，会导致数据丢失，这一点千万要注意，
        // 在编写下载文件功能时，要使用OutputStream流，避免使用PrintWriter流，
        // 因为OutputStream流是字节流，可以处理任意类型的数据，
        // 而PrintWriter流是字符流，只能处理字符数据，如果用字符流处理字节数据，会导致数据丢失。
        //注意 getWriter() 和getOutputStream() 只能用一个，一个字符输出流，一个字节输出流，都获取后就会出现这个异常。
        //outputChineseByOutputStream(response);


    }


    /**
     * 通过ServletContext对象读取WebRoot目录下的properties配置文件
     *
     * @param response
     * @throws IOException
     */
    private void readWebRootDirPropCfgFile(HttpServletResponse response)
            throws IOException {
        /**
         * 通过ServletContext对象读取WebRoot目录下的properties配置文件
         * “/”代表的是项目根目录
         */
        InputStream in = this.getServletContext().getResourceAsStream("/db2.properties");
        Properties prop = new Properties();
        prop.load(in);
        String driver = prop.getProperty("driver");
        String url = prop.getProperty("url");
        String username = prop.getProperty("username");
        String password = prop.getProperty("password");
        response.getWriter().println("读取WebRoot目录下的db2.properties配置文件：");
        response.getWriter().print(
                MessageFormat.format(
                        "driver={0},url={1},username={2},password={3}",
                        driver, url, username, password));
    }


    /**
     * 读取src目录下的gacl.servlet.study包中的db4.properties配置文件
     *
     * @param response
     * @throws IOException
     */
    private void readPropCfgFile2(HttpServletResponse response)
            throws IOException {
        InputStream in = this.getServletContext().getResourceAsStream("/WEB-INF/config/db4.properties");
        Properties prop = new Properties();
        prop.load(in);
        String driver = prop.getProperty("driver");
        String url = prop.getProperty("url");
        String username = prop.getProperty("username");
        String password = prop.getProperty("password");
        response.getWriter().println("读取src目录下的gacl.servlet.study包中的db4.properties配置文件：");
        response.getWriter().println(
                MessageFormat.format(
                        "driver={0},url={1},username={2},password={3}",
                        driver, url, username, password));
    }

    /**
     * 使用OutputStream流输出中文
     * @param request
     * @param response
     * @throws IOException
     */
    public void outputChineseByOutputStream(HttpServletResponse response) throws IOException{
        /**使用OutputStream输出中文注意问题：
         * 在服务器端，数据是以哪个码表输出的，那么就要控制客户端浏览器以相应的码表打开，
         * 比如：outputStream.write("中国".getBytes("UTF-8"));//使用OutputStream流向客户端浏览器输出中文，以UTF-8的编码进行输出
         * 此时就要控制客户端浏览器以UTF-8的编码打开，否则显示的时候就会出现中文乱码，那么在服务器端如何控制客户端浏览器以以UTF-8的编码显示数据呢？
         * 可以通过设置响应头控制浏览器的行为，例如：
         * response.setHeader("content-type", "text/html;charset=UTF-8");//通过设置响应头控制浏览器以UTF-8的编码显示数据
         */
        String data = "中国";
        OutputStream outputStream = response.getOutputStream();//获取OutputStream输出流
        /**
         * data.getBytes()是一个将字符转换成字节数组的过程，这个过程中一定会去查码表，
         * 如果是中文的操作系统环境，默认就是查找查GB2312的码表，
         * 将字符转换成字节数组的过程就是将中文字符转换成GB2312的码表上对应的数字
         * 比如： "中"在GB2312的码表上对应的数字是98
         *         "国"在GB2312的码表上对应的数字是99
         */
        /**
         * getBytes()方法如果不带参数，那么就会根据操作系统的语言环境来选择转换码表，如果是中文操作系统，那么就使用GB2312的码表
         */
        byte[] dataByteArr = data.getBytes("UTF-8");//将字符转换成字节数组，指定以UTF-8编码进行转换
        outputStream.write(dataByteArr);//使用OutputStream流向客户端输出字节数组
    }

}
